﻿#ifndef AI_H
#define AI_H

#include "Game.h"

//MoveResult记录Ai移动后对记录当前移动的评估
struct MoveResult
{
    //0表示不移动，1,2,3,4分别表示上下左右
    int moveDirction = 0;
    //分数
    double score = 0;
    //是否剪枝
    bool cutoffs = false;
    /* data */
};

class Ai
{
    public:
        Ai();
        
        //单步调用Ai，返回下一步运动方向
        int stepAi(int **arr);
    private:
        //算法相关的参数
        double searchTime;       //表示搜索的时间，更大的搜索时间表示更深的搜索，单位s
        double smoothWeight;   //平滑度权重
        double monoWeight;     //单调性权重
        double emptyWeight;    //空余格子数量权重
        double maxWeight;      //最大值权重

        //与评估相关的函数
        double eval(int **arr);          //静态评价函数
        double emptiness(int **arr);     //空旷度评估
        double smoothness(int **arr);    //平滑度评估
        double maxValue(int **arr);      //最大值评估
        double monotonicity(int **arr);  //单调性评估
        double islands(int **arr);       //孤立性评估
        inline bool overBound(int x,int y); //是否出界判断
        void markGrid(int **arr,int mark[][4],int x, int y, int value);   //类聚标记函数

        //单次α-β剪枝，深度优先搜索。
        MoveResult search(int **arr, int depth, double alpha, double beta, bool cutoffs, bool playerTurn);
        //在限定时间内，使用深度优先搜索，搜索可能的情况并进行剪枝
        MoveResult iterativeDeep(int **arr);
        //克隆一个二维数组
        void cloneGrid(int**newGrid,int **arr);
};




#endif // AI_H
